<?php

namespace app\api\controller;

use app\common\controller\Api;

/**
 * 流式输出诊断控制器
 * 用于诊断和解决服务器环境下的流式输出问题
 */
class StreamingDiagnostics extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

    /**
     * 诊断服务器环境配置
     */
    public function diagnose()
    {
        // 设置响应头为文本格式
        header('Content-Type: text/plain; charset=utf-8');
        
        echo "=== 流式输出环境诊断 ===\n\n";
        
        // 1. PHP配置检查
        echo "1. PHP配置检查:\n";
        echo "   PHP版本: " . PHP_VERSION . "\n";
        echo "   SAPI: " . PHP_SAPI . "\n";
        echo "   output_buffering: " . ini_get('output_buffering') . "\n";
        echo "   zlib.output_compression: " . ini_get('zlib.output_compression') . "\n";
        echo "   implicit_flush: " . ini_get('implicit_flush') . "\n";
        echo "   max_execution_time: " . ini_get('max_execution_time') . "\n";
        echo "   memory_limit: " . ini_get('memory_limit') . "\n\n";
        
        // 2. 服务器环境检查
        echo "2. 服务器环境检查:\n";
        echo "   Server Software: " . ($_SERVER['SERVER_SOFTWARE'] ?? 'Unknown') . "\n";
        echo "   Server Address: " . ($_SERVER['SERVER_ADDR'] ?? 'Unknown') . "\n";
        echo "   Remote Address: " . ($_SERVER['REMOTE_ADDR'] ?? 'Unknown') . "\n";
        echo "   Request Method: " . ($_SERVER['REQUEST_METHOD'] ?? 'Unknown') . "\n\n";
        
        // 3. 输出缓冲区检查
        echo "3. 输出缓冲区检查:\n";
        echo "   当前缓冲区层级: " . ob_get_level() . "\n";
        echo "   缓冲区状态: " . (ob_get_level() > 0 ? '启用' : '禁用') . "\n\n";
        
        // 4. 函数可用性检查
        echo "4. 关键函数检查:\n";
        echo "   fastcgi_finish_request(): " . (function_exists('fastcgi_finish_request') ? '可用' : '不可用') . "\n";
        echo "   apache_setenv(): " . (function_exists('apache_setenv') ? '可用' : '不可用') . "\n\n";
        
        // 5. 测试不同的流式输出方法
        echo "5. 流式输出测试:\n";
        echo "   开始测试不同的流式输出方法...\n\n";
        
        exit;
    }

    /**
     * 测试基础流式输出 - 最简版本
     */
    public function basic()
    {
        // 设置SSE响应头
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
        header('Connection: keep-alive');
        header('Access-Control-Allow-Origin: *');
        header('X-Accel-Buffering: no');

        // 强制清除所有输出缓冲区 - 重要修复
        while (ob_get_level() > 0) {
            ob_end_clean();
        }

        // 禁用PHP输出缓冲
        ini_set('output_buffering', 'off');
        ini_set('zlib.output_compression', 'off');
        ini_set('implicit_flush', '1');
        
        // 启用自动刷新
        ob_implicit_flush(true);
        
        // 设置无限制执行时间
        set_time_limit(0);

        // 发送初始数据
        echo "retry: 1000\n\n";
        flush();

        // 发送测试消息
        for ($i = 1; $i <= 3; $i++) {
            echo "data: Basic test message $i\n\n";
            flush();
            usleep(500000); // 0.5秒延迟
        }

        echo "data: end\n\n";
        flush();
        
        exit;
    }

    /**
     * 测试带事件的流式输出
     */
    public function withEvents()
    {
        // 设置SSE响应头
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
        header('Connection: keep-alive');
        header('Access-Control-Allow-Origin: *');
        header('X-Accel-Buffering: no');

        // 强制清除所有输出缓冲区 - 重要修复
        while (ob_get_level() > 0) {
            ob_end_clean();
        }

        // 禁用PHP输出缓冲
        ini_set('output_buffering', 'off');
        ini_set('zlib.output_compression', 'off');
        ini_set('implicit_flush', '1');
        
        // 启用自动刷新
        ob_implicit_flush(true);
        
        // 设置无限制执行时间
        set_time_limit(0);

        // 发送初始数据
        echo "retry: 1000\n\n";
        flush();

        // 发送开始事件
        echo "event: start\n";
        echo "data: 开始发送带事件的消息\n\n";
        flush();

        // 发送测试消息
        for ($i = 1; $i <= 3; $i++) {
            echo "event: message\n";
            echo "data: Event test message $i\n\n";
            flush();
            usleep(500000); // 0.5秒延迟
        }

        // 发送结束事件
        echo "event: end\n";
        echo "data: 消息发送完成\n\n";
        flush();
        
        exit;
    }

    /**
     * 测试长时间运行的流式输出
     */
    public function longRunning()
    {
        // 设置SSE响应头
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
        header('Connection: keep-alive');
        header('Access-Control-Allow-Origin: *');
        header('X-Accel-Buffering: no');

        // 强制清除所有输出缓冲区 - 重要修复
        while (ob_get_level() > 0) {
            ob_end_clean();
        }

        // 禁用PHP输出缓冲
        ini_set('output_buffering', 'off');
        ini_set('zlib.output_compression', 'off');
        ini_set('implicit_flush', '1');
        
        // 启用自动刷新
        ob_implicit_flush(true);
        
        // 设置无限制执行时间
        set_time_limit(0);

        // 发送初始数据
        echo "retry: 1000\n\n";
        flush();

        // 发送开始事件
        echo "event: start\n";
        echo "data: 开始长时间运行测试\n\n";
        flush();

        // 发送多条消息，模拟长时间运行
        for ($i = 1; $i <= 10; $i++) {
            echo "event: progress\n";
            echo "data: 进度: " . ($i * 10) . "%\n\n";
            flush();
            
            // 安全调用fastcgi_finish_request函数（仅在存在时调用）
            if (function_exists('fastcgi_finish_request')) {
                fastcgi_finish_request();
            }
            
            usleep(300000); // 0.3秒延迟
        }

        // 发送结束事件
        echo "event: end\n";
        echo "data: 长时间运行测试完成\n\n";
        flush();
        
        // 安全调用fastcgi_finish_request函数（仅在存在时调用）
        if (function_exists('fastcgi_finish_request')) {
            fastcgi_finish_request();
        }
        
        exit;
    }
    
    /**
     * 测试与BeanbunsStream.php相同的配置
     */
    public function beanbunsStyle()
    {
        // 设置SSE响应头
        header('Content-Type: text/event-stream; charset=utf-8');
        header('Cache-Control: no-cache, no-store, must-revalidate');
        header('Pragma: no-cache');
        header('Expires: 0');
        header('Connection: keep-alive');
        header('Access-Control-Allow-Origin: *');
        header('X-Accel-Buffering: no'); // 禁用Nginx缓冲
        
        // 强制清除所有输出缓冲区 - 重要修复
        while (ob_get_level() > 0) {
            ob_end_clean();
        }
        
        // 禁用PHP输出缓冲
        ini_set('output_buffering', 'off');
        ini_set('zlib.output_compression', 'off');
        ini_set('implicit_flush', '1');
        
        // 启用自动刷新
        ob_implicit_flush(true);
        
        // 设置无限制执行时间
        set_time_limit(0);
        
        // 立即刷新输出
        if (function_exists('apache_setenv')) {
            apache_setenv('no-gzip', '1');
        }
        
        // 发送初始数据，确保连接建立
        echo "retry: 1000\n\n";
        flush();
        
        // 安全调用fastcgi_finish_request函数（仅在存在时调用）
        if (function_exists('fastcgi_finish_request')) {
            fastcgi_finish_request();
        }
        
        // 发送开始事件
        echo "event: start\n";
        echo "data: " . json_encode(['content' => '开始测试Beanbuns风格的流式输出...'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n\n";
        flush();

        if (function_exists('fastcgi_finish_request')) {
            fastcgi_finish_request();
        }

        // 发送几条测试消息
        for ($i = 1; $i <= 5; $i++) {
            echo "event: content\n";
            echo "data: " . json_encode(['content' => "测试消息 $i"], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n\n";
            flush();
            
            // 安全调用fastcgi_finish_request函数（仅在存在时调用）
            if (function_exists('fastcgi_finish_request')) {
                fastcgi_finish_request();
            }
            
            // 模拟延迟
            usleep(500000); // 0.5秒
        }

        // 发送结束事件
        echo "event: end\n";
        echo "data: " . json_encode(['content' => '测试完成'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n\n";
        flush();

        if (function_exists('fastcgi_finish_request')) {
            fastcgi_finish_request();
        }

        exit;
    }
}